#ifndef __VAP_TYPE_
#define __VAP_TYPE_

#include <memory>
#include <chrono>
#include <opencv2/core.hpp>

namespace vap_type{

    enum vap_meta_type{
        frmae,         // 帧
        control        // 控制信息
    };
    /**
     * 类型： meta 元数据类型
     * 描述：节点间通信的基础数据类型
     * 
     * */ 
    class vap_meta
    {
    private:
        vap_meta_type meta_type_;       // meta 类型
        int channel_id_;     // 通道id
        std::chrono::system_clock::time_point create_time;      // meta 创建时间

    public: 
        vap_meta(vap_meta_type type,int channel_id):meta_type_(type),channel_id_(channel_id){
            create_time = std::chrono::system_clock::now();
        };
        ~vap_meta(){};

        // 每一个子类都需要实现clone()函数， clone 纯虚函数
        virtual std::shared_ptr<vap_meta> clone() = 0;
        vap_meta_type get_type(){return meta_type_;};
    };


    /**
     * 类型：vap_frame
     * 描述：节点与节点间图像传输的基本单元
    */
    class vap_frame: public vap_meta // 如果访问修饰符缺失，默认为private
    {
    private:
        cv::Mat frame_;
        int frame_id;
        int original_width_;
        int original_height_;
    public:
        vap_frame(cv::Mat  frame,int channel_id=-1,int frame_id =-1,int original_width=0,int original_height=0): \
            vap_meta(vap_type::vap_meta_type::frmae,channel_id),frame_(frame),original_width_(original_width),original_height_(original_height)\
        {
            // 断言，判断帧初始化后是否为空
            assert(!frame_.empty());
        };

        // 进行深拷贝
        vap_frame(const vap_frame& meta):vap_meta(meta),frame_id(meta.frame_id),\
                    original_height_(meta.original_height_),original_width_(meta.original_width_)
        {
            this->frame_ = meta.frame_.clone();
        };

        ~vap_frame(){};

        virtual std::shared_ptr<vap_meta> clone() override  
        {
            // make_shared函数使用时会调用使用对象类的拷贝构造函数,返回一个独立的新对象
            return std::make_shared<vap_frame>(*this);
        }
    };

    // 控制meta 类型
    enum vap_control_type {
        SPEAK,
        VIDEO_RECORD,
        IMAGE_RECORD
    };

    /**
     * 类型：vap_control
     * 描述：控制类型的meta信息
    */
    class vap_control: public vap_meta
    {
    private:
        vap_control_type type_;
    public:
        vap_control(vap_control_type type,int channel_id):vap_meta(vap_meta_type::control,channel_id),type_(type){};
        ~vap_control(){};

        virtual std::shared_ptr<vap_meta> clone() override 
        {
            return std::make_shared<vap_control>(*this);
        }
    };
};
#endif